#include <cv.h>
#include <highgui.h>

#include <stdlib.h>
#include <stdio.h>


#define WINDOWS_OS 1

//#define STATIKA_DEBUG 1


#ifdef WINDOWS_OS

	#include <process.h>  
	#include <windows.h>

#else
	
	#include <unistd.h>
	#include <pthread.h>

#endif


#define DEFAULT_BROJ_MIRNIH_FRAMEOVA 50
#define DEFAULT_PRAG_STATIKE 100.0
#define DEFAULT_PRAG_DINAMIKE 200.0

#define DEFAULT_FPS 15

#define IME_BOCNA_DINAMIKA "Bocna dinamika"
#define IME_GORNJA_DINAMIKA "Gornja dinamika"
#define IME_BOCNA_STATIKA "Bocna statika"
#define IME_GORNJA_STATIKA "Gornja statika"

#define PROZOR_POZICIJA_1 100
#define PROZOR_POZICIJA_2 500



typedef void (*dogadjajObjeStatike)(IplImage* imgGornja, IplImage* imgBocna);
typedef void (*dogadjajGornjaStatika)(IplImage* imgGornja);
typedef void (*dogadjajBocnaStatika)(IplImage* imgBocna);


class IzdvajanjeStatike
{

public:
	IzdvajanjeStatike(CvCapture *gornjaKamera, CvCapture *bocnaKamera);
	~IzdvajanjeStatike();

	void PostaviBrojMirnihFrameova(int gornja, int bocna);
	void PostaviGornjePragove(double pragStatike, double pragDinamike);
	void PostaviBocnePragove(double pragStatike, double pragDinamike);

	void PostaviROIGornja(int x, int y, int width, int height);
	void PostaviROIBocna(int x, int y, int width, int height);

	void KoristiOtklanjanjeSuma(void);

	void PostaviOpcijePrikaza(bool prikaziBocnuDinamiku, bool prikaziGornjuDinamiku, bool prikaziBocnuStatiku, bool prikaziGornjuStatiku);
	
	void KoristiFiksniFPS(void);
	void PostaviFiksniFPS(int fps);

	void Stop(void);
	bool IsStopped(void);

	void Pokreni(void);

	void HandleBocnuStatiku(dogadjajBocnaStatika handle);
	void HandleGornjuStatiku(dogadjajGornjaStatika handle);
	void HandleObjeStatike(dogadjajObjeStatike handle);


private:

#ifdef WINDOWS_OS
	static void DoWork(void *p);
#else
	static void *DoWork(void *p);
#endif

	CvCapture *_gornjaKamera;
	CvCapture *_bocnaKamera;

	int _brojMirnihFrameovaGornja;
	int _brojMirnihFrameovaBocna;

	double _pragStatikeGornja;
	double _pragDinamikeGornja;

	double _pragStatikeBocna;
	double _pragDinamikeBocna;

	CvRect _gornjaROI;
	CvRect _bocnaROI;
	bool _koristiROIgornja;
	bool _koristiROIbocna;

	bool _koristiOtklanjanjeSuma;

	bool _prikaziBocnuDinamiku;
	bool _prikaziGornjuDinamiku;
	bool _prikaziBocnuStatiku;
	bool _prikaziGornjuStatiku;

	bool _stop;
	bool _stopped;

	int _trenutnoStatickihBocnih;
	int _trenutnoStatickihGornjih;

	bool _gornjaMiruje;
	bool _bocnaMiruje;

	bool _koristiFiksniFPS;
	int _fiksniFPS;

	dogadjajObjeStatike _handleObjeStatike;
	dogadjajGornjaStatika _handleGornjaStatika;
	dogadjajBocnaStatika _handleBocnaStatika;

};

